FalconでRESTful Webサービスの実装 Part2
URIの改善
Part1 では、GETメソッドでタスクの一覧を取得したときにIDがそのまま表示されていました。
クライアントはタスクIDからURIを構築する必要がありますが、将来的にAPIのバージョンが変わったときにURIの変更が難しくなってしまいます。
そこで、タスクIDを返す代わりに、タスクを制御するURIを返すようにしておき、クライアントはそのURIを利用するようにしましょう。
id フィールドを uriフィールドに置き換える関数make_public_task() を作成します。
code: python
def make_public_task(task, uri, id_included=False):
new_task = task.copy()
id = new_task.pop('id')
if id_included:
new_task'uri' = uri
else:
new_task'uri' = f'{uri}/{id}'
return new_task
リソースメソッドをこれに対応させます。
code: python
class TaskListResource:
def on_get(self, req, resp):
resp.media = {'tasks':
make_public_task(task, req.uri) for task in tasks
}
# ...
class TaskResource:
def on_get(self, req, resp, id):
try:
task_id = int(id) - 1
task = taskstask_id
resp.media = {'tasks':
make_public_task(task, req.uri, id_included=True)
}
except IndexError:
resp.context'response' = {'result': 'Not Found'}
raise falcon.HTTPError(falcon.HTTP_404)
# ...
code: bash
$ curl -s -X GET http://127.0.0.1:8080/todo/api/v1.0/tasks | python -m json.tool
{
"tasks": [
{
"title": "Buy Beer",
"description": "IPA 6 bottles",
"done": false,
"uri": "http://127.0.0.1:8080/todo/api/v1.0/tasks/1"
},
{
"title": "Buy groceries",
"description": "Beef, Tofu, Sting Onion",
"done": false,
"uri": "http://127.0.0.1:8080/todo/api/v1.0/tasks/2"
}
]
}
code: bash
$ curl -s -X GET http://127.0.0.1:8080/todo/api/v1.0/tasks/1 | python -m json.tool
{
"tasks": {
"title": "Buy Beer",
"description": "IPA 6 bottles",
"done": false,
"uri": "http://127.0.0.1:8080/todo/api/v1.0/tasks/1"
}
}